iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
Software Development

iOS 學習筆記系列 第 15

Day15 Combine 02 - Publisher

  • 分享至 

  • xImage
  •  

Publisher

在Combine 中,Publisher 是觀察者模式中的Observable,並且可以通過組合變換(利用Operator)重新生成新的Publisher

主要功能是提供數據,不論是被動請求或是主動提供,有兩個 OutputFailure 關聯類型屬性,Output代表數據流中輸出的值,值的更新可能是同步,也可能是異步,Failure代表可能產生的錯誤,也就是說Pubslier 最核心的是定義了要發布的值與可能的錯誤。Publisher 通過receive(subscriber:)接口來接受訂閱,而Subscriber 訂閱者的 InputFailure 關聯類型屬性必須與 Publisher 聲明的 OutputFailure 類型相匹配來保證類型安全

以下舉一些常見的Publisher 例子:

  1. Just

    struct Just<Output>

    會給每個訂閱者發送一個消息,然後立即結束(這個數據流只包含一個值)

    let justPubliser = Just("Hello")
    
  2. Future

    typealias Future<Output, Failure>.Promise = (Result<Output, Failure>) -> Void

    Future是一個專門處理異步函數的Publisher,Future 初始化需要提供執行具體操作的closure,這個操作可以是異步的,並且最終返回一個Result,所以Future只有兩種結果:

    1. 發送一個值,然後正常結束
    2. 因錯誤而終止

    在將一些異步操作轉換為Publisher 時非常有用,像是網絡請求等等

    let futurePubliser = Future<Int, Never> { promise in
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            promise(.success(1))
        }
    }
    
  3. Deferred

    Deferred 初始化需要提供一個生成Publisher 的closure,只有在有Subscriber 訂閱的時候才會生成指定的Publisher,也就是當收到訂閱後才建立Publisher

    let deferredPublisher = Deferred {
        return Future<Bool, Error> { promise in
            DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
                return promise(.success(true))
            }
        }
    }
    

    Future不管有沒有訂閱者都會立刻執行,而Deferred只有當收到訂閱後才會初始化


上一篇
Day14 Combine 01 - 簡介
下一篇
Day16 Combine 03 - Subscriber
系列文
iOS 學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言